from django_redis import get_redis_connection
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from meiduo.apps.verifications import constants
import random
import logging

# 获取日志器
logger = logging.getLogger('django')


# 发送短信验证码视图
class SMSCodeView(APIView):
    '''
    method:GET
    URL: /sms_code/(?P<mobile>1[3-9]\d{9})/
    params: mobile
    '''

    def get(self, request, mobile):
        '''
        生成随机验证码
        将验证码保存到redis中
        发送短信
        返回响应
        :param request:
        :param mobile:
        :return: 状态
        '''
        # 创建redis对象
        redis_coon = get_redis_connection('verify_codes')
        # 获取标记
        sending_flag = redis_coon.get('sending_flag_%s' % mobile)
        # 判断标记是否存在
        if sending_flag:  # 如果有值

            # 返回操作频繁
            return Response({'message': '操作频繁,请稍后重试'}, status=status.HTTP_403_FORBIDDEN)

        # 生成随机验证码
        sms_code = '%06d' % random.randint(0, 999999)

        # 创建管道对象
        pl = redis_coon.pipeline()

        # 将验证码保存到redis中
        pl.setex('sms_code_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)

        # 限制频繁发送手机验证码 ,redis设置一个标记,在过期时间内,标记会存在
        pl.setex('sending_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)

        # 一次性执行管道中的代码
        pl.execute()

        # 设置发送验证码的有效时间 min
        expire = constants.SMS_CODE_REDIS_EXPIRES // 60

        # 控制台打印验证码
        logger.info(sms_code)
        from celery_tasks.sms.tasks import sms_send_code
        # 向中间人发送任务消息
        sms_send_code.delay(mobile, sms_code, expire)
        # 返回响应
        return Response({'message': '短信发送成功'}, status=status.HTTP_200_OK)
